<?php

namespace App\Service;

use GuzzleHttp\Client;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use Hyperf\Di\Annotation\Inject;

class RugbyArticleService
{
    /**
     * @Inject
     * @var ValidatorFactoryInterface
     */
    protected $validatorFactory;

    protected $apiKey = 'sk-adab94d73dc147859c5dd6b891fab1f9';

        public function generateArticle(array $data): array
    {

        $client = new Client([
            'base_uri' => 'https://api.deepseek.com',
            'headers' => [
                'Authorization' => 'Bearer ' . $this->apiKey,
                'Content-Type' => 'application/json'
            ],
            'verify' => false, // 生产环境建议配置正确的证书
            'timeout' => 80, // 总超时时间60秒
            'connect_timeout' => 10, // 连接超时10秒
            'http_errors' => false // 不抛出HTTP错误异常
        ]);

        try {
            $response = $client->post('/chat/completions', [
                'json' => [
                    'model' => 'deepseek-chat',
                    'messages' => [
                        ['role' => 'system', 'content' => 'You are an expert SEO content writer.'],
                        ['role' => 'user', 'content' => $this->rugbyPrompt($data)]
                    ],
                    'stream' => false,
                    'max_tokens' => 3000 // 限制最大token数
                ],
                'timeout' => 80 // 单独请求超时55秒
            ]);


            $result = json_decode($response->getBody()->getContents(), true);

            if (!isset($result['choices'][0]['message']['content'])) {
                throw new \RuntimeException('API返回结构无效');
            }

            $rawContent = $result['choices'][0]['message']['content'];
            $cleanedContent = preg_replace('/^```json|```$/m', '', $rawContent);
            $contentData = json_decode(trim($cleanedContent), true);

            // 确保返回包含正确的article_id
            $contentData['article_id'] = $data['add_article_id'] ?? 0;
            if (empty($contentData['article_id'])) {
                throw new \RuntimeException('缺少文章ID');
            }

            return $contentData;
        } catch (\Exception $e) {
            throw new \RuntimeException('API请求失败: '.$e->getMessage());
        }
    }

    private function rugbyPrompt(array $data): string
    {
        $excludeTitlesPrompt = '';
        if (!empty($data['blogs']) && is_array($data['blogs'])) {
            $titlesList = array_map(function ($title) {
                return "- " . trim($title);
            }, $data['blogs']);
            $titlesString = implode("\n", $titlesList);

            $excludeTitlesPrompt = <<<EXCLUDE
            
            # 注意事项
            以下是已经生成过的博客标题，请**不要生成与这些标题完全相同或意思相近的标题与内容**：
            
            {$titlesString}
            
            EXCLUDE;
        }

        return <<<PROMPT
            # 语言要求
            请使用 {$data['language']} 撰写整篇博客内容，包括标题、摘要、正文与元数据。
            
            # 指令
            请你扮演一名橄榄球博客写手，针对以下产品信息撰写一篇适合普通球迷阅读的博客文章。文章应围绕球衣本身展开，结合关键词、使用场景，内容可以包含：
            
            - 球衣的背景与设计理念（如历史版本、配色、徽章）
            - 球员穿着体验或故事
            - 适合的穿着场景（比赛日、日常、训练等）
            - 购买建议或搭配指南
            - 关联赛事预告或回顾
            - 俱乐部文化或球迷情感
            - 面料与技术特点
            - 球衣版型与合身类型（区分专业竞技版（贴身）、训练版（合身型）和休闲版（宽松））
            - 可作为特别场合的礼物推荐，如送给朋友、家人或橄榄球迷伙伴，增加情感共鸣
            
            语言风格轻松，具有画面感和代入感，吸引球迷点击、阅读和分享。
            请注意，文中插入的唯一商品图片，必须使用传入字段 image 的地址：{$data['image']}
            
            # 输入数据
            {
              "product_name": "{$data['name']}",
              "product_description": "{$data['desc']}",
              "product_keywords": "{$data['keywords']}",
              "product_scenario": "{$data['scenario']}",
              "product_language": "{$data['language']}"
            }
            
            {$excludeTitlesPrompt}
            
            # 输出要求
            {
              "article_title": {
                "description": "博客文章标题，≤12个单词",
                "要求": [
                  "必须包含主关键词 '{$data['keywords']}'",
                  "参考形式：'How the {$data['name']} Captures the Spirit of the Game'",
                  "或：'Why Every Fan Should Own the {$data['name']}'"
                ]
              },
            
              "short_description": {
                "description": "博客摘要，≤ 100个单词",
                "要求": [
                  "简短介绍球衣的特点和亮点",
                  "结合关键词，吸引点击",
                  "参考：'The {$data['name']} blends tradition and performance for every rugby fan. Discover its story.'"
                ]
              },
            
              "content": {
                "description": "博客正文，1477个单词以上，OpenCart支持格式",
                "结构建议": [
                  "## 第一段：设定情景/比赛氛围，引出球衣（含关键词）",
                  "## 第二段：球衣背景或设计灵感（如配色、历史意义）",
                  "## 第三段：球员故事/球场画面/球迷情感回顾",
                  "## 第四段：推荐使用场景（比赛日穿着、日常搭配）",
                  "## 第五段：购买建议（尺码建议/洗护/搭配）",
                  "## 第六段：赛事预告或俱乐部展望",
                  "## 最后一段：情感升华 + 行动号召（再次提及球衣名称）"
                ],
                "HTML规则": [
                  "内容用 &lt;div data-slate-node=\"element\"&gt; 包裹",
                  "段落用 &lt;p data-start=\"[900-3000]\" data-end=\"[900-3000]\"&gt;&lt;span style=\"font-size: 18px;\"&gt;...&lt;/span&gt;&lt;/p&gt;",
                  "插入一张商品图片，src 由输入字段 image 决定，格式如下：",
                  "&lt;img src=&quot;{$data['image']}&quot; alt=&quot;{$data['name']} {$data['keywords']}&quot; width=&quot;288&quot; height=&quot;288&quot; style=&quot;display: block; margin: 10px auto;&quot;&gt;"
                ]
              },
            
              "tags": [
                "生成 3-6 个标签，如：",
                "'{$data['keywords']}'",
                "'rugby jersey 2024'",
                "'fan gear guide'",
                "'match day outfit'"
              ],
            
              "meta_tag_title": "同 article_title，长度 ≤ 10 个单词",
              "meta_tag_description": "同 short_description，长度 ≤ 30 个单词",
              "meta_tag_keywords": "'{$data['keywords']}', 再生成 1-4 个"
            }
            
            # 最终返回格式
            {
                "post_title": "",
                "short_description": "",
                "description": "",
                "meta_tag_title": "",
                "meta_tag_description": "",
                "meta_keywords": "",
                "tags": "",
                "language_id": {$data['language']},
                "article_id": {$data['add_article_id']}
            }
            PROMPT;
    }

}
